原帖 | Jason | 2026-07-06 16:51 | 👍1 | 阅读约1
最近有学员在问 PCIe,PCIe 和 USB 都是高速外设,所以难度很大,今天给大家稍微总结一下 PCIe debug 部分。
下面专注在 PCIe RC 侧调试。
一、链路linkup失败(LTSSM四段排查)
排查手段:内核日志搜 pcie、adb lspci 查看 EP 设备状态,PCIe 不支持热插拔。
1. Detect 检测阶段(LTSSM=0x0)
硬件自动识别EP插入/上电;报错0x0多是PHY模式未切RC、CLK引脚配置错、PHY复位、LTSSM未使能;报错0x1/0x1000001基本是EP没电、电容损坏、收发接反、容值错误,属于必现硬故障。
2. Polling轮询阶段
(LTSSM=0x3000003/0x2000003)
收发TS1/TS2做位同步、速率协商;必现问题查参考时钟、阻容、PCB布线波形,也可能EP固件烧写错误不回复TS;偶发多是信号兼容问题,可降速测试,留意合规测试模式。
3. Configuration配置阶段
(LTSSM=0x5000003)
协商链路宽度、通道对齐;故障基本是RC MAC配置错误,EP侧很少出问题。
4. Recovery恢复阶段
多用于速率切换,异常需读取对应寄存器分场景定位。
二、MMIO访问异常
1. 驱动初始化第一笔MMIO直接失败
- RC总线地址重映射配置异常;
- AP端PCIe AXI时钟异常。
2. 运行中偶发/固定位置MMIO超时失败
- 链路信号差,频繁触发Recovery,可统计恢复次数、降速验证;
- EP深度休眠响应慢;
- EP供电不足掉卡;
排查方法:抓取AER报错、读取设备寄存器、逻辑分析仪抓包。
三、性能不达标
1. CPU负载过高,中断处理不及时;
2. 开启L1SS低功耗,进出链路带来延迟;
3. 信号质量差导致链路自动降速。
排查:top看CPU占用,lspci -vv查看当前速率、L1SS开关状态。
四、休眠唤醒suspend/resume故障
1. Suspend进L2失败
- wake#引脚持续拉低,反复退出低功耗;
- EP 提前断电,握手失败;
- EP 未发送 EIOS 空闲报文,RC 无法正常进入 L2,可抓 PM 报文确认握手流程。
2. Resume唤醒失败
本质复现linkup失败、MMIO访问失败两类问题。
五、AER高级错误上报
可选功能,链路/传输异常时,内核日志检索 AER 关键字定位硬件、TLP、链路校正/致命错误,配合原厂寄存器表定位根源。
六、中断问题
INTx 模拟中断、MSI 消息中断初始化流程极易出错,调试重点核对 MSI 地址、数据、中断向量映射。
七、配套面试核心考点
1. PCIe 内存读写 TLP 包机制;
2. PCIe 总线拓扑、地址空间映射转换逻辑;
3. MSI 中断原理、Linux 配置流程、中断号查询、硬件存储位置;
4. PCIe 配置空间组成、内核读取配置空间流程。
踩了无数个 PCIe Bug 总结出来的,全是干货,大家快看。
相关笔记
- 📁 返回本主题 MOC
- Linux BSP问题闭环流程
- 从MCU转Linux BSP开发
- DDR替换后内核崩溃排查
- 嵌入式Linux调试iic
- 老师,学习Android Camera架构时
- Linux Android GT911触控调试